home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / Dev / mamesrc / src / amiga / audio.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-12-03  |  4.7 KB  |  163 lines

  1. #ifndef AUDIO_H
  2. #define AUDIO_H
  3. /**************************************************************************
  4.  *
  5.  * Copyright (C) 1999 Mats Eirik Hansen (mats.hansen@triumph.no)
  6.  *
  7.  * $Id: audio.h,v 1.1 1999/04/28 18:50:56 meh Exp $
  8.  *
  9.  * $Log: audio.h,v $
  10.  * Revision 1.1  1999/04/28 18:50:56  meh
  11.  * Initial revision
  12.  *
  13.  *
  14.  *************************************************************************/
  15.  
  16. #include <devices/ahi.h>
  17.  
  18. struct MameSample
  19. {
  20.     ULONG ID;     /* 'MAME'. */
  21.     ULONG Length;   /* NB! little endian. */
  22.     ULONG Frequency;  /* NB! little endian. */
  23.     UBYTE Resolution; /* 8/16 bit. */
  24.     UBYTE Volume;
  25.     UWORD dummy;
  26.     UBYTE Data[0];
  27. };
  28.  
  29. #define AA_UseAHI   (TAG_USER)
  30. #define AA_Channels   (TAG_USER+1)
  31. #define AA_MaxSounds  (TAG_USER+2)
  32. #define AA_MapChannel0  (TAG_USER+3)
  33. #define AA_MapChannel1  (TAG_USER+4)
  34. #define AA_MapChannel2  (TAG_USER+5)
  35. #define AA_MapChannel3  (TAG_USER+6)
  36. #define AA_MinFreeChip  (TAG_USER+7)
  37.  
  38. struct AChannel
  39. {
  40.   LONG  Flags;
  41.   LONG  Frequency;
  42.   LONG  Volume;
  43.   LONG  Length;
  44.   LONG  Sound;
  45.   BYTE  *Buffer;
  46. };
  47.  
  48. #define ACF_Loop      0x00000001
  49. #define ACF_SetFrequency  0x00000002
  50. #define ACF_SetVolume   0x00000004
  51. #define ACF_SetLength   0x00000008
  52. #define ACF_SetSample   0x00000010
  53. #define ACF_SetSound    0x00000020
  54. #define ACF_Stop      0x00000040
  55. #define ACF_Restart     0x00000080
  56.  
  57. struct AChannelArray
  58. {
  59.   struct Audio    *Audio;
  60.   LONG            Size;
  61.   LONG            Length;
  62.   LONG            Flags;
  63.   LONG            MasterVolume;
  64.   struct AChannel *Channels;
  65. };
  66.  
  67. struct Audio
  68. {
  69.   LONG                      UseAHI;
  70.   struct MsgPort            *MsgPort;
  71.   struct AHIRequest         *AHIRequest;
  72.   struct Library            *AHIBase;
  73.   struct TagItem            *AHITags;
  74.   struct AHIAudioCtrl       *AHIAudioCtrl;
  75.   struct AHISampleInfo      AHISampleInfo;
  76.   struct AHIEffMasterVolume AHIEffMasterVolume;
  77.   struct IOAudio            *AudioRequests;
  78.   ULONG                     MinFreeChip;
  79.   LONG                      MasterVolume;
  80.   LONG                      Channels;
  81.   LONG                      NextSound;
  82.   struct MinList            Sounds;
  83.   struct AChannelArray      *ChannelArray;
  84.   LONG                      BufferSize;
  85.   BYTE                      *Buffers;
  86.   BYTE                      Status[4];
  87.   BYTE                      MapChannels[4];
  88.   ULONG                     FrequencyModifier[4];
  89. };
  90.  
  91. #define AS_IDLE     0
  92. #define AS_PLAYING1 1
  93. #define AS_PLAYING2 2
  94.  
  95. struct ASound
  96. {
  97.   struct MinNode       Node;
  98.   LONG                 Sound;
  99.   LONG                 Frequency;
  100.   LONG                 Volume;
  101.   struct AHISampleInfo AHISampleInfo;
  102. };
  103.  
  104. struct Audio *AllocAudio(Tag,...);
  105. void FreeAudio(struct Audio *audio);
  106. struct AChannelArray *AAllocChannelArray(struct Audio *audio, LONG length);
  107. void AFreeChannelArray(struct AChannelArray *channelarray);
  108. void ASetChannelFrame(struct AChannelArray *channelarray);
  109. struct ASound *ALoadSound(struct Audio *audio, UBYTE *sample, LONG res, LONG len, LONG freq, LONG vol);
  110. struct ASound *AReadSound(struct Audio *audio, BPTR file);
  111. ULONG AResample(ULONG *freq, ULONG maxfreq, ULONG *length, ULONG maxlength);
  112.  
  113. static inline void APlaySample(struct AChannelArray *ca, LONG channel, LONG frequency,
  114.                                LONG volume, LONG length, UBYTE *sample, BOOL loop)
  115. {
  116.   ca->Channels[channel].Frequency = frequency;
  117.   ca->Channels[channel].Volume    = volume;
  118.   ca->Channels[channel].Length    = length;
  119.   ca->Channels[channel].Sound     = (LONG) sample;
  120.   ca->Channels[channel].Flags     = ACF_SetFrequency|ACF_SetVolume|ACF_SetLength|
  121.                                     ACF_SetSample|((loop)?ACF_Loop:0);
  122. }
  123.  
  124. static inline void APlaySound(struct AChannelArray *ca, LONG channel, LONG frequency,
  125.                               LONG volume, LONG sound, BOOL loop)
  126. {
  127.   ca->Channels[channel].Frequency = frequency;
  128.   ca->Channels[channel].Volume    = volume;
  129.   ca->Channels[channel].Sound     = sound;
  130.   ca->Channels[channel].Flags     = ACF_SetFrequency|ACF_SetVolume|
  131.                                     ACF_SetSound|((loop)?ACF_Loop:0);
  132. }
  133.  
  134. static inline void ASetMasterVolume(struct AChannelArray *ca, LONG volume)
  135. {
  136.   ca->MasterVolume = volume;
  137.   ca->Flags        = ACF_SetVolume;
  138. }
  139.  
  140. static inline void ASetFrequency(struct AChannelArray *ca, LONG channel, LONG frequency)
  141. {
  142.   ca->Channels[channel].Frequency =  frequency;
  143.   ca->Channels[channel].Flags     |= ACF_SetFrequency;
  144. }
  145.  
  146. static inline void ASetVolume(struct AChannelArray *ca, LONG channel, LONG volume)
  147. {
  148.   ca->Channels[channel].Volume =  volume;
  149.   ca->Channels[channel].Flags  |= ACF_SetVolume;
  150. }
  151.  
  152. static inline void AStopChannel(struct AChannelArray *ca, LONG channel)
  153. {
  154.   ca->Channels[channel].Flags = ACF_Stop;
  155. }
  156.  
  157. static inline void ARestartChannel(struct AChannelArray *ca, LONG channel)
  158. {
  159.   ca->Channels[channel].Flags = ACF_Restart;
  160. }
  161.  
  162. #endif
  163.